package com.hejia.alauda.service;

import java.math.BigDecimal;
import java.util.*;

import com.hejia.alauda.entity.*;
import com.hejia.alauda.entity.example.BonusRecordExample;
import com.hejia.alauda.entity.example.CreditOperationExample;
import com.hejia.alauda.entity.example.DuibaOrderExample;
import com.hejia.alauda.entity.example.QualificationExample;
import com.hejia.alauda.utils.Pager;

public interface CreditService {

	/**
	 * 计算用户购买某产品后获得的积分
	 * 
	 * @param financing
	 * @param user
	 * @return
	 */
	boolean calculateProductCredits(Financing financing);

	/**
	 * 根据用户ID获得积分信息
	 * 
	 * @param id
	 * @return
	 */
	Credit findCreditByUserId(Long id);

	/**
	 * 根据用户ID获得今天获得的积分总和
	 * 
	 * @param id
	 * @return
	 */
	int sumTodayCredits(Long id);

	/**
	 * 获得指定用户的积分明细
	 * 
	 * @param user
	 * @return
	 */
	List<CreditOperation> findCreditOperationsByUser(User user);

	Pager<CreditOperation> recentChanges(Pager<CreditOperation> pager);

	/**
	 * 获得指定用户的积分明细--带分页
	 * 
	 * @param user
	 * @return
	 */
	Pager<CreditOperation> findCreditOperationsByPager(
			CreditOperationExample example, Pager<CreditOperation> pager);

	/**
	 * 更新用户的积分信息
	 */
	int updateCredit(Credit record);

	/**
	 * 增加积分兑换记录
	 * 
	 * @param record
	 * @return
	 */
	int insertCreditOperation(CreditOperation record);

	/**
	 * 增加/减少用户的积分
	 * 
	 * @param credits
	 * @param user
	 * @param operation
	 * @return
	 */
	boolean addCreditOperation(Integer credits, User user,
			CreditOperation.Operation operation, String description);

	int sendRookieCredits(User user, CreditOperation.Operation operation);

	/**
	 * 查找所有手动添加积分用户
	 * 
	 * @param pager
	 * @return
	 */

	public Pager<CreditOperation> findManualCredit(Pager<CreditOperation> pager);

	/**
	 * 查找所有手动添加积分用户
	 * 
	 * @param pager
	 * @return
	 */
	public Pager<CreditOperation> findManualCredit(
			Pager<CreditOperation> pager, CreditOperationExample example);


    /**
     * 增加兑吧的订单
     * @param entity
     * @return
     */
    int insertDuibaOrder(DuibaOrder record);

    /**
     * 更新兑吧的订单状态
     * @param status
     * @param orderNum
     * @return
     */
    int dealExchangeResult(Integer status,String orderNum);

    /**
     * 根据条件查询一条兑吧订单记录
     * @param example
     * @return
     */
    DuibaOrder findDuibaOrderByExample(DuibaOrderExample example);


    /**
     * 发放红包
     * @param userId	接受人ID
     * @param code	红包类型编码
     * @param term	有效期限，为0则以红包类型中指定的日期为截至日期
     * @param amount	金额，为Null则以红包类型中指定的金额为红包额度。
     * @param description	描述。
     * @return
     */
	boolean giveBonus(Long userId, String code, int term,BigDecimal amount,String description, String type, String operator);
	
	/**
	 * 查询抽奖资格记录的行数（可以带条件）
	 * @param example
	 * @return
	 */
	int countQualificationByExample(QualificationExample example);
	
	/**
	 * 按照查询条件分页查询红包记录
	 * @param example
	 * @param pager
	 * @return
	 */
	Pager<BonusRecord> findBonusRecordListByPager(Map<String,Object> params,Pager<BonusRecord> pager);
	
	/**
	 * 根据id查询用户的红包记录
	 * @param id
	 * @return
	 */
	BonusRecord findBonusRecordById(Long id);
	
	/**
	 * 查询红包是购买哪个产品激活的
	 * @param bonusRecord
	 * @return
	 */
	BonusOrder findBonusOrderByBonusRecord(BonusRecord bonusRecord);
	
	/**
	 * 保存红包的激活记录
	 * @param orderNumber
	 * @param bonusRecord_id
	 */
	void createActivation(String orderNumber,Long bonusRecord_id);
	
	/**
	 * 第三方支付回调的时候真正激活红包记录
	 * @param orderNumber
	 */
	void activateBonusRecord(Order order);

    /**
     * 红包记录
     */
    List<BonusRecord> bonusRecordPager(Pager<BonusRecord> pager);

	BigDecimal findBonusAmount(Map<String,Object> bonusExample);
	
	/**
	 * 根据条件查询红包记录
	 * @param example
	 * @param pager
	 * @param isPagination
	 * @return
	 */
	Pager<BonusRecord> findBonusRecordPager(BonusRecordExample example, Pager<BonusRecord> pager, boolean isPagination);
	
	/**
	 * 标记用户红包为已读
	 * @param id
	 * @return
	 */
	int updateReadByUser(Long id);
	
	/**
	 * 删除注册红包
	 * @param id
	 * @return
	 */
	int removeRegisterBonusRecord(Long id);
	
	/**
	 * 增加随机红包
	 * @param user
	 * @param amount
	 */
	void insertRandomBonusRecord(User user, String redcode);
	
	/**
	 * 查询用户未使用未过期的红包数量
	 * @param user
	 * @return
	 */
	int countUnusedBonusRecordByUser(User user);
}
